﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Data.OleDb;
using System.Data;

using RAE.Persistencia;
using RAE.Logica.Info;
using System.Windows.Forms;

namespace RAE.Logica.ExcelLogic
{
    class ExcelImport
    {
        private static int limpiarElo(string texto, string nombre)
        {
            try
            {
                string resultado = "";
                foreach (char c in texto)
                    if (Char.IsDigit(c))
                        resultado += c;
                    else
                        break;
                
                return Int32.Parse(resultado);
            }
            catch (FormatException x)
            {
                MessageBox.Show("El valor del puntaje Elo de {0} no es un número válido. Provisionalmente, se le asignará un puntaje de 0.", nombre);
                return 0;
            }
        }

        public static void leerExcel(string archivo)
        {
            try
            {
                DataTable dt = GetDataTable(archivo, "Hoja1");

                DataColumn colRank = dt.Columns[0];
                DataColumn colTitulo = dt.Columns[1];
                DataColumn colNombre = dt.Columns[2];
                DataColumn colRating = dt.Columns[3];

                foreach (DataRow dr in dt.Rows)
                {
                    Ajedrecista a = new Ajedrecista();
                    a.nombre = dr[colNombre].ToString();
                    a.apellidos = "";
                    a.nacionalidad = Controladores.Aplicacion.paises[1];
                    a.esResidente = true;
                    a.cedula = "";
                    a.tel_celular = "";
                    a.tel_residencia = "";
                    a.email = "";
                    a.comentario = "";
                    a.puntaje_elo = limpiarElo(dr[colRating].ToString(), a.nombre);
                    
                    Cargador.registrarAjedrecista(a);
                }
            }
            catch (Exception x)
            {
                MessageBox.Show("El documento seleccionado no corresponde con el formato de archivo de ranking esperado.");
                return;
            }

            Controladores.Aplicacion.initAjedrecistas();
            MessageBox.Show("Importación realizada con éxito.");
        }

        private static DataTable GetDataTable(string file, string worksheet)
        {
            string cnn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", file);
            Console.Out.WriteLine("Archivo:{0}", file);
            DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");

            DataTable dtXLS = new DataTable(worksheet);
            using (DbConnection conn = factory.CreateConnection())
            {
                conn.ConnectionString = cnn;
                using (OleDbCommand cmd = (OleDbCommand)conn.CreateCommand())
                {
                    cmd.CommandText = string.Format("SELECT * FROM [{0}$]", worksheet);
                    conn.Open();

                    OleDbDataAdapter adapter = new OleDbDataAdapter();
                    adapter.SelectCommand = cmd;
                    adapter.Fill(dtXLS);
                    conn.Close();
                    return dtXLS;
                }
            }
        }
    }
}
